import './render'; // 初始化Canvas
import DataBus from './databus'; // 导入数据类，用于管理游戏状态和数据
import ZombieManager from './npc/zombie_manager';
import Music from './runtime/music.js';
import Sprite from './base/sprite';
import DraggablePlant from './plants/draggable_plant';
import Plant from './plants/plant';
import Peashooter from './plants/peashooter';
import Pikachu from './plants/pikachu';
 // 导入图片管理器
import imageManager from './base/image_manager.js';
import Wusaqi from './plants/wusaqi.js';

const ctx = canvas.getContext('2d'); // 获取canvas的2D绘图上下文;

GameGlobal.databus = new DataBus(); // 全局数据管理，用于管理游戏状态和数据

/**
 * 游戏主函数
 */
export default class Main {
  aniId = 0; // 用于存储动画帧的ID

  constructor() {
   this.zombieManager = new ZombieManager(100); // 每60帧生成一个僵尸
   GameGlobal.zombieManager = this.zombieManager; // 将僵尸管理器存入全局变量
   this.music = Music.getInstance(); // 初始化音乐管理器，自动播放背景音乐
    // 设置背景图尺寸为canvas大小以全屏显示
   

    // 使用图片管理器获取图片
    this.bg = new Sprite('graphics/Items/Background/Background_0.jpg', canvas.width, canvas.height, 0, 0);
    this.liebiao = new Sprite('graphics/Screen/ChooserBackground.png', 596, 70, 0, 0);

    // 初始化植物列表
    this.plants = []; // 可拖拽植物列表
    this.placedPlants = []; // 已放置的植物列表
    this.initPlants();

    // 开始游戏
    this.start();
  }

  

 
  /**
   * 开始或重启游戏
   */
  start() {
    GameGlobal.databus.reset(); // 重置数据
    cancelAnimationFrame(this.aniId); // 清除上一局的动画
    this.aniId = requestAnimationFrame(this.loop.bind(this)); // 开始新的动画循环
  }


  /**
   * canvas重绘函数
   * 每一帧重新绘制所有的需要展示的元素
   */
  // 初始化植物列表
    initPlants() {
      // 创建几个可拖拽植物示例
      // 保存植物卡片图片路径
      const plantTypes = [
          'graphics/Cards/card_peashooter.png',
          'images/pkq/ff0.png',
          'images/wusaqi/f0.png'
        ];

      plantTypes.forEach((img, index) => {
        // 使用ImageManager获取图片
        const plant = new DraggablePlant(img, 60, 70, 20 + index * 70, 10);
        // 设置释放回调
        plant.onRelease((x, y) => {
            console.log('植物释放位置:', x, y);
            // 创建对应的植物实例
            let newPlant;
            switch(index) {
              case 0:
                // 创建豌豆射手实例
                newPlant = new Peashooter(x, y);
                break;
              case 1:
                // 创建向日葵实例（暂时使用Plant类）
                newPlant = new Pikachu('images/pkq/ff', 12, 70, 70, 5, x, y);
                break;
              case 2:
                // 创建樱桃炸弹实例（暂时使用Plant类）
                newPlant = new Wusaqi( 'images/wusaqi/f', 12, 70, 70, 5, x, y);
                break;
              default:
                newPlant = new Peashooter(x, y, this.resourceLoader);
            }
            this.placedPlants.push(newPlant);
          });
        this.plants.push(plant);
      });
    }

  render() {
    ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布


    this.bg.render(ctx);
    this.liebiao.render(ctx);
    // // 渲染已放置的植物
    this.placedPlants.forEach(plant => plant.render(ctx));
    // // 渲染子弹
    GameGlobal.databus.bullets.forEach(bullet => bullet.render(ctx));
    // // 渲染可拖拽植物列表
    this.plants.forEach(plant => plant.render(ctx));
    this.zombieManager.render(ctx);
    // 渲染伤害文本
    GameGlobal.databus.damageTexts.forEach(text => text.render(ctx));
    // 渲染特效
    if (GameGlobal.databus.animations) {
      GameGlobal.databus.animations.forEach(anim => anim.render(ctx));
    }
  }

  // 游戏逻辑更新主函数
  update() {
    GameGlobal.databus.frame++; // 增加帧数
    this.zombieManager.update();
    // 更新已放置植物的动画
    this.placedPlants.forEach(plant => plant.update());
    // 更新子弹
    GameGlobal.databus.bullets.forEach(bullet => bullet.update());
    // 更新伤害文本
    GameGlobal.databus.damageTexts.forEach(text => text.update());
    // 更新特效
    if (GameGlobal.databus.animations) {
      GameGlobal.databus.animations.forEach(anim => anim.update());
    }

  }

  // 实现游戏帧循环
  loop() {
    this.update(); // 更新游戏逻辑
    this.render(); // 渲染游戏画面

    // 请求下一帧动画
    this.aniId = requestAnimationFrame(this.loop.bind(this));
  }
}
